package com.marketing.tenant.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.Components;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * Swagger/OpenAPI 3 配置
 */
@Configuration
public class SwaggerConfig {

    @Value("${server.servlet.context-path:/tenant}")
    private String contextPath;

    @Value("${server.port:8083}")
    private String serverPort;

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(apiInfo())
                .servers(List.of(
                        new Server()
                                .url("http://localhost:" + serverPort + contextPath)
                                .description("本地开发环境"),
                        new Server()
                                .url("https://api.smart-marketing.com" + contextPath)
                                .description("生产环境")
                ))
                .addSecurityItem(new SecurityRequirement().addList("Bearer Authentication"))
                .components(new Components()
                        .addSecuritySchemes("Bearer Authentication",
                                new SecurityScheme()
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")
                                        .description("请输入JWT token，格式：Bearer <token>")));
    }

    private Info apiInfo() {
        return new Info()
                .title("智能营销系统 - 租户管理服务API")
                .description("SaaS多租户管理核心服务，提供租户注册、配置管理、订阅管理、使用统计等功能。\\n\\n" +
                        "## 功能特性\\n" +
                        "- **租户管理**: 租户注册、信息维护、状态管理\\n" +
                        "- **配置管理**: 租户个性化配置、主题设置、功能开关\\n" +
                        "- **使用统计**: API调用统计、存储使用量、用户活跃度\\n" +
                        "- **多租户隔离**: 基于MyBatis-Plus的数据隔离\\n" +
                        "- **权限控制**: 基于JWT的接口权限验证\\n" +
                        "- **租户识别**: 支持多种租户识别方式（Header、域名、路径参数）\\n\\n" +
                        "## 认证说明\\n" +
                        "所有API接口（除健康检查外）都需要JWT token认证。\\n" +
                        "请先通过认证服务获取token，然后在请求头中添加：\\n" +
                        "`Authorization: Bearer <your-jwt-token>`\\n\\n" +
                        "## 租户识别\\n" +
                        "系统支持多种租户识别方式：\\n" +
                        "1. **请求头**: `X-Tenant-Id: 123` 或 `X-Tenant-Code: demo`\\n" +
                        "2. **子域名**: `tenant1.example.com`\\n" +
                        "3. **路径参数**: `/tenant/{tenantCode}/api/...`\\n" +
                        "4. **查询参数**: `?tenantId=123` 或 `?tenantCode=demo`")
                .version("1.0.0")
                .contact(new Contact()
                        .name("智能营销系统开发团队")
                        .email("dev@smart-marketing.com")
                        .url("https://smart-marketing.com"))
                .license(new License()
                        .name("Apache License 2.0")
                        .url("https://www.apache.org/licenses/LICENSE-2.0"));
    }
}